인가 코드 흐름
📋 문서 버전
이 문서는 2개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.
인가 코드 흐름
개요
인가 코드 흐름(Authorization Code Flow)은 OAuth 2.0 프로토콜에서 가장 널리 사용되는 인증 및 권한 부여 방식 중 하나로, 클라이언트 애플리케이션이 리소스 소유자(사용자)의 대신으로 보호된 리소스에 접근할 수 있도록 안전하게 토큰을 획득하는 절차를 제공합니다. 이 흐름은 주로 웹 애플리케이션과 같이 백엔드 서버를 보유한 클라이언트에서 사용되며, 보안성이 높아 공개 클라이언트보다는 기밀 클라이언트(Confidential Client)에 적합합니다.
인가 코드 흐름의 핵심 목적은 사용자의 자격 증명(예: 아이디/비밀번호)을 클라이언트 애플리케이션이 직접 처리하지 않도록 하면서도, 액세스 토큰(Access Token)을 안전하게 발급받아 서버 자원에 접근할 수 있도록 하는 것입니다.
인가 코드 흐름의 동작 원리
인가 코드 흐름은 다음과 같은 단계로 구성됩니다. 이 과정은 사용자, 클라이언트 애플리케이션, 인가 서버(Authorization Server), 리소스 서버(Resource Server) 간의 상호작용을 포함합니다.
1. 사용자 인가 요청
클라이언트 애플리케이션은 사용자를 인가 서버의 인가 엔드포인트(Authorization Endpoint)로 리디렉션합니다. 이 요청에는 다음 정보가 포함됩니다:
[client_id](/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88%EC%9D%B8%EC%A6%9D/%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%20%EC%9D%B8%EC%A6%9D/client_id): 클라이언트의 고유 식별자response_type=code: 인가 코드를 요청함을 명시[redirect_uri](/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88%EC%9D%B8%EC%A6%9D/%EC%9D%B8%EC%A6%9D%20%ED%9D%90%EB%A6%84/redirect_uri): 인가 후 리디렉션될 URI[scope](/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88%EC%9D%B8%EC%A6%9D/%EA%B6%8C%ED%95%9C%20%EA%B4%80%EB%A6%AC/scope): 요청하는 권한 범위 (예:read,write)[state](/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88%EC%9D%B8%EC%A6%9D/%EB%B3%B4%EC%95%88%20%EB%B0%A9%EC%96%B4/state): CSRF 공격 방지를 위한 임의의 값
예시 요청:
GET /authorize?
response_type=code&
client_id=abc123&
redirect_uri=https://client.example.com/callback&
scope=read&
state=xyz789
HTTP/1.1
Host: auth.example.com
2. 사용자 인증 및 동의
인가 서버는 사용자가 로그인되어 있지 않으면 인증을 요구하고, 로그인 후에는 클라이언트가 요청한 권한 범위에 대한 사용자 동의(Consent)를 받습니다. 사용자가 동의하면, 인가 서버는 사용자를 redirect_uri로 리디렉션하면서 인가 코드(Authorization Code)를 전달합니다.
예시 응답:
HTTP/1.1 302 Found
Location: https://client.example.com/callback?
code=AUTH_CODE_123&
state=xyz789
⚠️ 인가 코드는 단일 사용이며, 짧은 유효 시간(일반적으로 5~10분)을 가집니다.
3. 액세스 토큰 요청
클라이언트 애플리케이션은 백엔드 서버에서 인가 서버의 토큰 엔드포인트(Token Endpoint)로 POST 요청을 보내, 인가 코드를 액세스 토큰으로 교환합니다. 이 요청에는 다음 정보가 포함됩니다:
grant_type=authorization_codecode: 이전 단계에서 받은 인가 코드redirect_uri: 동일한 리디렉션 URIclient_id및[client_secret](/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88%EC%9D%B8%EC%A6%9D/%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%20%EC%9D%B8%EC%A6%9D/client_secret): 클라이언트 인증을 위한 정보
예시 요청:
POST /token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=AUTH_CODE_123&
redirect_uri=https://client.example.com/callback&
client_id=abc123&
client_secret=secret456
4. 액세스 토큰 발급
인가 서버는 요청을 검증한 후, 유효한 경우 다음과 같은 응답을 반환합니다:
{
"access_token": "ACCESS_TOKEN_456",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "REFRESH_TOKEN_789"
}
이제 클라이언트는 access_token을 사용하여 리소스 서버에 보호된 자원을 요청할 수 있습니다.
보안 장점
인가 코드 흐름은 다른 OAuth 흐름(예: 임시 자격 증명 흐름)보다 보안성이 뛰어난 이유는 다음과 같습니다:
- 클라이언트 인증: 토큰 발급 시
client_secret을 사용하여 클라이언트를 인증하므로, 코드가 유출되더라도 악용이 어렵습니다. - 코드의 단기성: 인가 코드는 짧은 시간 내에 만료되며, 한 번만 사용 가능합니다.
- 리디렉션 URI 검증: 인가 서버는 등록된
redirect_uri와 일치하는지 확인하여 리디렉션 공격을 방지합니다. - state 파라미터: CSRF 공격을 방어하기 위해 무작위
state값을 사용합니다.
PKCE 확장 (PKCE - Proof Key for Code Exchange)
공개 클라이언트(예: 모바일 앱, 싱글 페이지 애플리케이션)에서도 인가 코드 흐름을 안전하게 사용하기 위해 PKCE(Proof Key for Code Exchange) 확장이 도입되었습니다. PKCE는 클라이언트가 [code_verifier](/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88%EC%9D%B8%EC%A6%9D/PKCE/code_verifier)와 [code_challenge](/doc/%EA%B8%B0%EC%88%A0/%EB%B3%B4%EC%95%88%EC%9D%B8%EC%A6%9D/PKCE/code_challenge)를 생성하여 인가 요청 시 전달하고, 토큰 요청 시 code_verifier를 다시 제출함으로써 인가 코드의 재사용 공격을 방지합니다.
이 방식은 인가 코드 흐름 + PKCE로 불리며, 현재 모던 웹 및 모바일 앱에서 표준으로 사용되고 있습니다.
관련 표준 및 참고 자료
- RFC 6749 - The OAuth 2.0 Authorization Framework
- RFC 7636 - Proof Key for Code Exchange by OAuth Public Clients (PKCE)
- OAuth 2.1 (draft): 기존 OAuth 2.0의 보안 취약점을 개선한 차기 표준
관련 문서
✅ 인가 코드 흐름은 보안과 기능성의 균형을 잘 유지한 방식으로, 웹 서비스 간 안전한 연동을 위한 핵심 기술입니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.